'use strict';
/** 任务系统 */
module.exports.run = function(d,s){
    const bs = require("../module/base"), bag = require("./bag"), tkc = require("../config/task" + s.U.gamename), gamec = require("../config/" + s.U.gamename);
    switch(d[1]){
        case 1:{ //任务列表
            if(s.U.gamename){
                d[2] = tkc;
                bs.send(s, d);
            }
            break;
        }case 2:{ //领取任务奖励
            if(!bs.checkParam(["tid"], d)) return;
            if(s.U.gamename){
                if(!(d[2].tid in tkc)){
                    LOG.error("not task", d[2].tid);
                    return;
                }
                let tk = tkc[d[2].tid];
                if(d[2].tid in s.U.task.rw){
                    return bs.sendE(s, 10);
                }
                if(tk.req == 6){ //等级需要特殊判断
                    let lv = 1;
                    for(let k in gamec.level){
                        if(s.U.bag[5] < gamec.level[k]) break;
                        lv = k|0;
                    }
                    if(lv < tk.num){
                        return bs.sendE(s, 9);
                    }
                }else if(!(s.U.task[tk.day][tk.req] && s.U.task[tk.day][tk.req] >= tk.num)){
                    return bs.sendE(s, 9);
                }
                bag.add(tk.reward, s, null, 6, d[2].tid);
                s.U.task.rw[d[2].tid] = (s.U.task.rw[d[2].tid] || 0) + 1;
                bs.send(s, [5,3,s.U.task]);
            }
            break;
        }case 3:{ //获取任务进度
            d[2] = s.U.task;
            bs.send(s, d);
            break;
        }case 4:{ //客户端事件
            if(!bs.checkParam(["req"], d)) return;
            d[2].req = d[2].req | 0;
            if(d[2].req < 100) return;
            this.events(d[2].req, s);
            break;
        }case 5:{ //七天签到
            if(s.U.task.d7t){
                let sd = new Date(s.U.task.d7t), nd = new Date();
                if(sd.getDate() == nd.getDate()) return LOG.error("is sign", s.U.uid);
                sd.setDate(sd.getDate() + 1);
                if(sd.getDate() != nd.getDate()){
                    s.U.task.d7 = 0;
                }
            }else{
                s.U.task.d7 = 0;
            }
            //签到7天送个宝箱位置
            if(s.U.task.d7 == 6 && s.U.game.boxnum < 2){
                s.U.game.boxnum = 2;
                bs.sendE(s, 10001);
            } 
            //已经签过7天了重新变一天
            if(s.U.task.d7 >= 7){
                s.U.task.d7 = 0;
            } 
            s.U.task.d7++;
            s.U.task.d7t = Date.now();
            if(tkc.sign[s.U.task.d7-1]) bag.add(tkc.sign[s.U.task.d7-1], s, null, 3, s.U.task.d7);
            bs.send(s, [5,3,s.U.task]);
            break;
        }case 6:{ //领取活跃度奖励
            if(!s.U.task.active) s.U.task.active = {};
            //判断活跃度
            if(!s.U.bag[4]) s.U.bag[4] = 0;
            if(s.U.bag[4] < d[2]) return bs.sendE(s, 14);
            if(!(d[2] in s.U.task.active)){
                if(d[2] in tkc.active){
                    s.U.task.active[d[2]] = 1;
                    bag.add(tkc.active[d[2]], s, null, 11, d[2]);
                    bs.send(s, [5,3,s.U.task]);
                }
            }else{
                return bs.sendE(s, 10);
            }
            break;
        }case 7:{ //转盘
            if(!tkc.zhuanpan){
                return LOG.error("zhuangpan null");
            }
            if(s.U.task.zp){
                let sd = new Date(s.U.task.zp), nd = new Date();
                if(sd.getDate() == nd.getDate()) return LOG.error("is zhuanpan", s.U.uid);
            }

            let num = 0;
            for(let n=0;n<tkc.zhuanpan.length;n++) num += tkc.zhuanpan[n][0];
            let rd = Math.random() * num | 0, cp = 0;
            for(let n=0;n<tkc.zhuanpan.length;n++){
                cp += tkc.zhuanpan[n][0];
                if(cp > rd){
                    s.U.task.lrw = [[tkc.zhuanpan[n][1],tkc.zhuanpan[n][2]]]
                    d[2] = n;
                    bs.send(s, d);
                    break;
                }
            }
            s.U.task.zp = Date.now();
            bag.add(s.U.task.lrw, s, null, 18, d[2]);
            break;
        }case 8:{ //看视频再领取
            if(s.U.task.lrw){
                bag.add(s.U.task.lrw, s, null, 17);
                delete s.U.task.lrw;
            }
            break;
        }
    }
}

/** 任务事件 */
module.exports.events = function(d,s,v){
    if(s.U.task.lt){
        let td = new Date(s.U.task.lt), nd = new Date();
        if(td.getDate() != nd.getDate()){ //跨天了
            td.setDate(td.getDate() + 1);
            if(td.getDate() == nd.getDate()){ //天连续的
                //连续操作处理
                for(let dk in s.U.task["2"]){
                    if(!(dk in s.U.task["1"])) delete s.U.task["2"][dk];
                }
            }else{
                s.U.task["2"] = {};
            }
            const bag = require("./bag");
            //每日
            s.U.task["1"] = {};
            if(s.U.gamename){
                const tkc = require("../config/task" + s.U.gamename);
                for(let k in tkc){
                    if(tkc[k].day == 1){
                        delete s.U.task.rw[k];
                    }
                }
            }
            //活跃度更新
            if(s.U.bag[4] > 0){
                bag.add([[4, -s.U.bag[4]]], s, null, 10);
            }
            //活跃领取奖励重置
            s.U.task.active = {};
            //清理转盘时间
            delete s.U.task.zp;
        }
    }
    //登录事件
    if(d == 3){
        let sd = new Date(s.U.task.d7t), nd = new Date();
        if(sd.getDate() != nd.getDate()){
            sd.setDate(sd.getDate() + 1);
            if(sd.getDate() != nd.getDate()) s.U.task.d7 = 0;
        }
    }
    v = v || 1;
    s.U.task["0"][d] = (s.U.task["0"][d] || 0) + v;
    s.U.task["1"][d] = (s.U.task["1"][d] || 0) + v;
    //一天一次
    if(s.U.task["1"][d] == 1){
        s.U.task["2"][d] = (s.U.task["2"][d] || 0) + v;
        //连续分享3天特殊处理
        if(d == 100 && s.U.task["2"][d] >= 3 && !("200" in s.U.task.rw)){
            this.run([3,2,{tid:200}], s);
        }
    } 
    s.U.task.lt = Date.now();
    this.run([5,3], s);
    //看广告
    if(d == 102){
        const tkc = require("../config/task" + s.U.gamename), bag = require("./bag");
        if(tkc.look && tkc.look[s.U.task["1"][d]]){
            bag.add(tkc.look[s.U.task["1"][d]], s, null, 17);
        }
    }
}
